使用 promise 時可以在 then
方法中放入自訂的處理函式,而預期的錯誤處理是把函式中的錯誤都當作 promise rejection,很直覺的作法就是在呼叫函式時加上 try...catch
,有錯時呼叫 reject
。
以 onFulfilled
為例,可以寫成這樣:
then(onFulfilled, onRejected) {
···
let fulfilledTask;
if (typeof onFulfilled === 'function') {
fulfilledTask = function () {
try {
const r = onFulfilled(self.promiseResult);
returnValue.resolve(r);
} catch (e) {
returnValue.reject(e);
}
};
} else {
fulfilledTask = function () {
returnValue.resolve(self.promiseResult);
};
}
···
}
以上 promise 實作差不多告一段落,像一開始所說,這個實作是把 resolve 和 reject 當作方法,如果想要像真正的 promise 一樣把它們做成建構式的 callback 參數,可以參考這段 revealing constructor pattern。
這是書裡附的實作 repo:DemoPromise。另外這段統整了 promise 的一些優點和限制,可以參考。
關於 promise 本身大概寫到這邊,最後還有一點 promise 以外、關於 macrotask 和 microtask 的內容 (雖然這塊很想逃避,但終究還是要寫一下)。